package jwt

import (
	"errors"
	"time"

	"github.com/golang-jwt/jwt/v4"
	"github.com/inntu/backend/api/models"
	"github.com/inntu/backend/config"
)

// 从配置文件中获取JWT配置
var (
	cfg *config.Config
)

func init() {
	// 初始化配置，使用默认profile
	var err error
	cfg, err = config.NewConfig("zyx", "dev") // 使用zyx profile和dev环境
	if err != nil {
		// 如果配置加载失败，使用默认值
		cfg = &config.Config{}
		cfg.JWT.SECRET = "inNTU_admin_secret_key"
		cfg.JWT.EXPIRE = 24
	}
}

// Claims 自定义JWT声明结构
type Claims struct {
	UserID   uint   `json:"user_id"`
	Username string `json:"username"`
	Role     string `json:"role"`
	jwt.RegisteredClaims
}

// GenerateToken 生成JWT令牌
func GenerateToken(user *models.User) (string, error) {
	expireTime := time.Now().Add(time.Duration(cfg.JWT.EXPIRE) * time.Hour) // 从配置中获取令牌有效期

	claims := Claims{
		UserID:   user.ID,
		Username: user.Username,
		Role:     user.Role,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expireTime),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			Subject:   "admin_user",
		},
	}

	tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	token, err := tokenClaims.SignedString([]byte(cfg.JWT.SECRET))

	return token, err
}

// ParseToken 解析JWT令牌
func ParseToken(token string) (*Claims, error) {
	tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(cfg.JWT.SECRET), nil
	})

	if err != nil {
		return nil, err
	}

	if tokenClaims != nil {
		if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
			return claims, nil
		}
	}

	return nil, errors.New("invalid token")
}